脚本化规则
在此部分:
关于脚本化规则
脚本规则允许使用 Windows PowerShell 或 VB 脚本创建自定义规则。 脚本的成功或失败决定了作为规则一部分的“安全级别”、“允许的项目”和“拒绝的项目”是否适用于用户。
脚本化规则可利用任何通过 PowerShell 或 VBScript 访问的接口,例如 COM(组件对象模型)。
在以下环境下对每个脚本进行评估:
- 将新配置部署到计算机时。
- 用户登录时。
要创建或编辑脚本,请转至 应用程序控件 配置编辑器所需的脚本化规则集。 规则集 > 脚本化 > [Rule Set name]
您可以使用以下脚本规则选项来定义脚本何时运行:
- 运行脚本:
- 每个会话以用户身份 - 对于登录的每名用户,脚本均会运行。 设置仅适用于用户会话的时间。
- 每个会话以系统身份 - 对于登录的每名用户,脚本均会使用系统帐户权限运行。 设置仅适用于用户会话的时间。
- 每台计算机以系统身份 - 脚本在计算机启动时使用系统帐户权限运行一次。 设置适用于所有用户会话,直到计算机重新启动、应用程序控件 代理重新启动或配置发生更改为止。
- 等待登录以完成 - 选择此项,阻止脚本在用户登录完成前运行。
注意:作为系统用户运行脚本可能会对计算机造成严重损坏,只能由有经验的脚本作者启用。
VBScripts
每个脚本都在托管脚本引擎中运行,允许对脚本执行进行更有效的控制,同时提供高度的输入和输出控制。
- 不使用 VBS 文件。
- 没有生成单独的进程。
脚本必须作为函数编写,并且可以包含许多函数,但是必须指定一个主启动函数。 启动函数由 应用程序控件 代理运行,可用于调用其他函数。
AMScriptRule COM 对象内置在脚本引擎中,并提供对以下方法的访问:
strUsername = AMScriptRule.UserName
strUserdomain = AMScriptRule.UserDomain
strSessionid = AMScriptRule.SessionID
strStationname = AMScriptRule.WinStation
此实例中的 Microsoft standard 表示 WinStation 返回终端服务会话名称的值,其由会话的类型决定,典型值是 ’Console’ 或 ’RDP-Tcp#34’,而不是窗口站的名称(通常为 WinSta0)。
AMScriptRule COM 对象还包括以下方法:
strLog = AMScriptRule.Log "My Log Statement"
允许您将记录字符串输出到代理日志文件中,以用于调试脚本规则。
strEnvironmentvar = AMScriptRule.ExpandEnvironment ("%MyEnvironmentVariables%")
展开运行脚本的用户的环境变量。
使用 WScript. shell 展开环境变量仅返回 SYSTEM 变量。
Windows PowerShell 脚本
如果脚本以值 0 返回(退出),则脚本将通过并且应用规则。 如果返回任何非零值,则脚本将失败并且不应用规则。
每个 PowerShell 脚本都在 PowerShell.exe 的实例中执行,因此 应用程序控件 既不强制执行也不添加任何特定语法,所有格式正确的 PowerShell 都将正常工作。
PowerShell 必须安装在任何将使用脚本的端点上。
示例脚本
以下 VBScript 演示了如何控制用户可以访问的应用程序。
Function ScriptedRule()
’Name of Filter scan expected to pass
ExpectedFilter = "FWALL"
’Get Server Name
Set objNTinfo = CreateObject ("WinNTSystemInfo")
ServerName = lcase (objNTInfo.ComputerName)
’Set initial return value
ScriptedRule = False
’Create MetaFrame Session Object
Set MFSession = Createobject ("MetaFrameCOM.MetaFrameSession")
’Initialize the session filters for this session
For Each x in MFSession.SmartAccessFilters
’return true if our filter is found
If x = ExpectedFilter Then
ScriptedRule=True
AMScriptRule.Log "SmartAccessFilter match found."
End If
Next
End Function
以下 VBScript 可用于确定计算机是否在计算机组织单位中:
Function ScriptedRule()
ScriptedRule = vbFalse
strCompName = AMScriptRule.StationName
Set oRootDSE = GetObject("LDAP://RootDSE")
strDNSDomain = oRootDSE.Get("DefaultNamingContext")
Set oOU = GetObject("LDAP://OU=TheOUyouAreSearching,OU=Parent,OU=Parent," & strDNSDomain)
oOU.GetInfo
For each member in oOU
If UCase(strCompName) = UCase(member.CN) Then
ScriptedRule = vbTrue
Exit For
End If
Next
End Function
以下示例 VBScript 显示了脚本的主要组件,并演示了如何访问登录到系统的用户的用户名信息,以及如何与特定域和组织单位匹配:
Function MyScript()
'Get the username of the user logging in (also works when running as SYSTEM)
strUserName = AMScriptRule.UserName
'Get the domain of the user logging in (also works when running as SYSTEM)
strUserDomain = AMScriptRule.UserDomain
'Look up user environment variables (when running as SYSTEM, only SYSTEM variables are available)
strClientName = AMScriptRule.ExpandEnvironment ("%ClientName%")
'Log the output
AMScriptRule.Log strUserName & " logged in on " & strClientName
'Check if the user is a member of the domain
If strUserdomain = "MyDomain" Then
'If so, see if the user is in the MyOU OU
Set objOU = GetObject ("LDAP://ou=MyOU,dc=MyDomain,dc=com")
objOU.Filter = Array("user")
For Each objUser In objOU
'Check if there is a match with the user logging on
If objUser.sAMAccountName = strUserName Then
'if there is, then set the function to True
MyScript = True
End If
Next
End If
'Unless there is a username match, the function defaults to False
End Function
以下示例 Windows PowerShell 脚本显示了脚本的主要组件,并演示了如何访问登录到系统的用户的用户名信息,以及如何与特定域和组织单位匹配:
#Script checks if the current user is a member of the OU specified
# Return 0 if TRUE
# 1 otherwise
$logonuser = $env:username
$bindpt = [adsi] "LDAP://OU=TS_Users,OU=Users,OU=MyUser,OU=MyOU,DC=MyDomain,DC=com"
$users = New-Object System.DirectoryServices.DirectorySearcher $bindpt
$users.Filter = "(&(objectClass=User)(sAMAccountName=$logonuser))"
$obj = $users.FindOne()
if($obj -eq $null)
{
#" Not a Member"
exit 1
}